package com.rede.didiok.user.modulelist.rank.entity;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.rede.didiok.common.dto.rank.RankMemberDto;
import com.rede.didiok.common.dto.user.UserDto;
import com.rede.didiok.common.entity.SuperEntity;
import com.rede.didiok.common.enums.OriginalEnum;
import com.rede.didiok.common.enums.StatusEnum;
import com.rede.didiok.common.utils.StringUtils;

/**
 * 榜单成员
 * 
 * @author Rede
 * @email didiok@foxmail.com
 * @date 2023-09-01 14:54:33
 */
@Data
@TableName("r_rank_member")
public class RankMemberEntity extends SuperEntity<RankMemberEntity> {
	private static final long serialVersionUID = 1L;

	/**
	 * 唯一oid【自动递增】
	 */
	private Integer oid;

	/**
	 * 博客标题
	 */
	private String title;

	/**
	 * 点赞数
	 */
	private Integer praiseCount;

	/**
	 * 点踩数量
	 */
	private Integer treadCount;

	/**
	 * 博客收藏数
	 */
	private Integer collectCount;

	/**
	 * 是否原创
	 */
	private String isOriginal;

	/**
	 * 如果原创，作者为管理员名
	 */
	private String author;

	/**
	 * 文章出处
	 */
	private String articlesPart;

	/**
	 * 文章类型【0 博客， 1：推广】
	 */
	private String type;

	/**
	 * 外链【如果是推广，那么将跳转到外链】
	 */
	private String outsideLink;

	/**
	 * 文章来源【0 后台添加，1 用户投稿】
	 */
	private String articleSource;

	/**
	 * 文章字符数
	 */
	private Integer charCount;

	/**
	 * 成员名称
	 */
	private String memberName;
	/**
	 * 封面图片url地址
	 */
	private String memberCover;
	/**
	 * 榜单uid
	 */
	private String rankUid;
	/**
	 * 标题图片uid
	 */
	private String fileUid;
	/**
	 * 管理员UID
	 */
	private String adminUid;
	/**
	 * 榜单名称
	 */
	private String rankName;
	/**
	 * 所属榜单分类uid
	 */
	private String catUid;
	/**
	 * 所属榜单分类名称
	 */
	private String catName;
	/**
	 * 上榜理由uid
	 */
	private String reasonUid;
	/**
	 * 上榜理由名称
	 */
	private String reasonName;
	/**
	 * 成员简介
	 */
	private String summary;

	/**
	 * 等级称号uid
	 */
	private String gradeUid;
	/**
	 * 等级称号名称
	 */
	private String gradeName;
	/**
	 * 是否发布：0否，1是
	 */
	private Integer isPublish;
	/**
	 * 标签uid
	 */
	private String tagUid;
	/**
	 * 是否允许他人添加里程碑事件:0否，1是
	 */
	private Integer otherAddMilestone;
	/**
	 * 是否开启评论(0:否 1:是)
	 */
	private Integer openComment;
	/**
	 * 支付方式：0：默认 1: 支付宝, 2: 微信 3: 第三方支付宝 4: 第三方微信 11:蓝兔支付中的微信支付 12:私下转账
	 */
	private Integer payMethod;

	/**
	 * 创建人uid
	 */
	private String createUserUid;
	/**
	 * 创建人名称
	 */
	private String createUserName;
	/**
	 * 发布时间
	 */
	private Date publishTime;

	/**
	 * 审核状态【0：审核未通过，1：审核通过】
	 */
	private Integer auditStatus;

	/**
	 * 活动状态【0：活动取消，1：正常】
	 */
	private Integer activityStatus;

	/**
	 * 审核时间
	 */
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	private Date auditTime;

	/**
	 * 审核人名称
	 */
	private String auditName;

	/**
	 * 榜单成员内容
	 */
	private String content;

	/**
	 * 文章来源【0 后台添加，1 用户投稿】
	 */
	private String rankMemberSource;

	/**
	 * 审批拒绝原因
	 */
	private String rejectReason;

	/**
	 * 推荐级别，用于首页推荐
	 * 0：正常
	 * 1：一级推荐(轮播图)
	 * 2：二级推荐(top)
	 * 3：三级推荐 ()
	 * 4：四级 推荐 (特别推荐)
	 */
	private Integer level;

	/**
	 * 是否开启加载校验
	 */
	private Integer openLoadingValid;

	/**
	 * 排序字段，数值越大，越靠前
	 */
	private Integer sort;

	/**
	 * 分数，用于推荐排序Count
	 */
	private Integer score;

	/**
	 * 是否置顶
	 */
	private Integer isTop;

	/**
	 * 点击数
	 */
	private Integer voteCount;

	/**
	 * 点击数
	 */
	private Integer clickCount;

	/**
	 * 评论数
	 */
	private Integer commentCount;

	/**
	 * 阅读权限：1 公开、2 登录后可见、3 评论后可见、4 输入验证码可见、5 会员可见、6 付费可见
	 */
	private Integer visitAuth;

	// 以下字段不存入数据库，封装为了方便使用

	/**
	 * 内容
	 */
	@TableField(exist = false)
	private String member_uid;
	/**
	 * 等级
	 */
	@TableField(exist = false)
	private MemberGradeEntity grade;

	/**
	 * 标签,一篇博客对应多个标签
	 */
	@TableField(exist = false)
	private List<MemberGradeEntity> gradeList;

	/**
	 * 标题图
	 */
	@TableField(exist = false)
	private List<String> photoList;

	/**
	 * 博客分类
	 */
	@TableField(exist = false)
	private RankCategoryEntity category;

	/**
	 * 博客标题图
	 */
	@TableField(exist = false)
	private String photoUrl;

	/**
	 * 版权申明
	 */
	@TableField(exist = false)
	private String copyright;

	/**
	 * 博客所属专题
	 */
	@TableField(exist = false)
	private RankEntity rank;

	/**
	 * 标签,一篇博客对应多个标签
	 */
	@TableField(exist = false)
	private List<MemberTagEntity> tagList;

	/**
	 * 投稿人
	 */
	@TableField(exist = false)
	private UserDto user;

	/**
	 * 点赞相关信息
	 */
	@TableField(exist = false)
	private Map<String, Object> likeInfo;

	/**
	 * 收藏相关信息
	 */
	@TableField(exist = false)
	private Map<String, Object> collectInfo;

	/**
	 * 积分合计
	 */
	@TableField(exist = false)
	private String sumCredits;

	/**
	 * 点赞用户列表
	 */
	@TableField(exist = false)
	private List<UserDto> praiseUserList;

	/**
	 * 点赞相关信息
	 */
	@TableField(exist = false)
	private Map<String, Object> praiseInfo;

	/**
	 * 访问鉴权成功
	 */
	@TableField(exist = false)
	private Boolean visitAuthSuccess;

	/**
	 * 支付订单数
	 */
	@TableField(exist = false)
	private Integer payOrderCount;
	/**
	 * 前端使用的标红的作者名
	 */
	@TableField(exist = false)
	private String authorName;


	/**
	 * 根据VO创建DO对象
	 *
	 * @param isAdmin     是否是管理员
	 * @param uid         用户Uid
	 * @param userName
	 * @param
	 * @return
	 */
	public RankMemberEntity buildRankMember(RankMemberDto rankMemberDto, Boolean isAdmin, String uid, String userName) {

		// 编辑操作时候，会携带rankMemberEntity过来
		if (isAdmin) {
			this.setAdminUid(uid);
		} else {
			this.setCreateUserUid(uid);
		}

		/**
		 * 检测原创
		 */
		if (OriginalEnum.ORIGINAL.equals(this.getIsOriginal())) {
			this.setAuthor(userName);
		} else {
			this.setAuthor(rankMemberDto.getAuthor());
			this.setArticlesPart(rankMemberDto.getArticlesPart());
		}
		/**
		 * 设置标题 内容 简介
		 */
		this.setTitle(rankMemberDto.getTitle());
		this.setMemberName(rankMemberDto.getMemberName());
		this.setContent(rankMemberDto.getContent());
		if (StringUtils.isNotEmpty(rankMemberDto.getSummary())) {
			this.setSummary(rankMemberDto.getSummary());
		} else {
			String summary = StringUtils.dealContent(rankMemberDto.getContent());
			if (summary.length() < 190) {
				this.setSummary(summary);
			} else {
				this.setSummary(summary.substring(0, 190) + "...");
			}
		}
		this.setCreateUserName(userName==null?rankMemberDto.getCreateUserName():userName);
		this.setTagUid(rankMemberDto.getTagUid());
		this.setGradeUid(rankMemberDto.getGradeUid());
		this.setGradeName(rankMemberDto.getGradeName());
		this.setRankUid(rankMemberDto.getRankUid());
		this.setRankName(rankMemberDto.getRankName());
		this.setFileUid(rankMemberDto.getFileUid());
		this.setIsOriginal(rankMemberDto.getIsOriginal());
		this.setType(rankMemberDto.getType());
		this.setOutsideLink(rankMemberDto.getOutsideLink());
		this.setOutsideLink(rankMemberDto.getOutsideLink());
		this.setLevel(rankMemberDto.getLevel());
		this.setIsPublish(rankMemberDto.getIsPublish());
		this.setStatus(StatusEnum.ENABLE);
		this.setOpenComment(rankMemberDto.getOpenComment());
		this.setPayMethod(rankMemberDto.getPayMethod());
		this.setRankMemberSource(rankMemberDto.getRankMemberSource());
		this.setAuditStatus(rankMemberDto.getAuditStatus());
		this.setIsTop(rankMemberDto.getIsTop());
		this.setSort(rankMemberDto.getSort());
		this.setCharCount(rankMemberDto.getContent().length());
		this.setVisitAuth(rankMemberDto.getVisitAuth());
		// 用户投稿，默认都不开启校验
		this.setOpenLoadingValid(rankMemberDto.getOpenLoadingValid());
		// 设置专题信息
		return this;
	}

	// AttrInfoEntity

	/**
	 * 省名称
	 */
	@TableField(exist = false)
	private String province;
	/**
	 * 省code
	 */
	@TableField(exist = false)
	private String provinceCode;
	/**
	 * 市名称
	 */
	@TableField(exist = false)
	private String city;
	/**
	 * 市code
	 */
	@TableField(exist = false)
	private String cityCode;
	/**
	 * 区名称
	 */
	@TableField(exist = false)
	private String district;
	/**
	 * 区code
	 */
	@TableField(exist = false)
	private String districtCode;
	/**
	 * 经度
	 */
	@TableField(exist = false)
	private BigDecimal longitude;
	/**
	 * 纬度
	 */
	@TableField(exist = false)
	private BigDecimal latitude;
	/**
	 * 地址名称
	 */
	@TableField(exist = false)
	private String address;
	/**
	 * 活动开始时间
	 */
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@TableField(exist = false)
	private Date startTime;
	/**
	 * 活动结束时间
	 */
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@TableField(exist = false)
	private Date endTime;
	/**
	 * 报名截止时间
	 */
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@TableField(exist = false)
	private Date applyEndTime;
	/**
	 * 报名费
	 */
	@TableField(exist = false)
	private BigDecimal price;
	/**
	 * 人数上限
	 */
	@TableField(exist = false)
	private Integer allowPeopleNum;
	/**
	 * 领队佣金
	 */
	@TableField(exist = false)
	private BigDecimal leaderSalary;
	/**
	 * 领队人数上限
	 */
	@TableField(exist = false)
	private Integer allowLeaderNum;
	/**
	 * 领队条件
	 */
	@TableField(exist = false)
	private String leaderCondition;
	/**
	 * 领队工作内容
	 */
	@TableField(exist = false)
	private String leaderTask;
	/**
	 * 领队备注
	 */
	@TableField(exist = false)
	private String leaderRemark;

	/**
	 * 领队报名截止时间
	 */
	@TableField(exist = false)
	private Date leaderApplyEndTime;
	/**
	 * 备注
	 */
	@TableField(exist = false)
	private String remark;
	/**
	 * 发起人的微信号
	 */
	@TableField(exist = false)
	private String weChat;
	/**
	 * 发起人的手机号
	 */
	@TableField(exist = false)
	private String phone;
	/**
	 * 活动时间范围
	 */
	@TableField(exist = false)
	private String timeRange;
	/**
	 * 活动详细地址
	 */
	@TableField(exist = false)
	private String fullAddress;
	/**
	 * 当前活动所有报名成功的人数
	 */
	@TableField(exist = false)
	private Integer totalApplyUserNum;
	/**
	 * 当前活动所有报名领队的人数
	 */
	@TableField(exist = false)
	private Integer totalApplyLeaderNum;
	/**
	 * 是否活动结束
	 */
	@TableField(exist = false)
	private int isEnd;
	/**
	 * 是否报名截止
	 */
	@TableField(exist = false)
	private int isApplyEnd;
	/**
	 * 是否领队报名截止
	 */
	@TableField(exist = false)
	private int isLeaderApplyEnd;
	/**
	 * 是否报名截止
	 */
	@TableField(exist = false)
	private int isApplyUserNumFull;
	/**
	 * 是否领队人数已够
	 */
	@TableField(exist = false)
	private int isLeaderUserNumFull;
	/**
	 * 是否报名截止
	 */
	@TableField(exist = false)
	private Integer rankSort;
	/**
	 * 支付方式：0：默认 1: 支付宝, 2: 微信 3: 第三方支付宝 4: 第三方微信 11:蓝兔支付中的微信支付 12:私下转账
	 */
	@TableField(exist = false)
	private String payMethodName;
}
